Blender のラインアートの使い方
目次
概要
ラインアートはバージョン 2.93 以降で使える。ラインアートは、カメラから見たオブジェクトの輪郭抽出を行い、グリースペンシルオブジェクトのレイヤーに書き出すモディフィアだ。
ラインアートはモディフィアなので、ひとつのグリースペンシルオブジェクトに重ねて使える。エッジタイプごとにモディフィアを分けたり、レイヤーを分けたりしておくと、ベイク後に編集が楽になることもある。
他の輪郭抽出技法との比較
背面法
輪郭にのみ線が必要な場合、背面法が代替案になる。背面法はポリゴン数が多くてもリアルタイムで描画できる。
ベベルモディフィア
ベベルで制限方法を角度にしてマテリアルを適用すれば、クリース線が出せる。制限方法を頂点グループにすれば、辺マークも可能。この方法も描画負荷が低い。ただしベベルによってメッシュが変形する。
Ambient Occlusion
Malt
Malt はレンダラーで、GLSL でシェーダが書ける。オブジェクト交差線・クリース・輪郭が検出できる。高性能な GPU ならば数百万ポリゴンでもリアルタイムで描画できる。
コンポジター
コンポジターは計算負荷が、ポリゴン数ではなくレンダリング解像度に比例するのが強みだ。ポリゴン数の多い巨大なシーンならば、コンポジター以外に選択肢がないこともある。
フリースタイル
スチルならフリースタイルの方が線の自由度が高い。ただし交差線を出すには、工夫が必要になる。スチルなら、交差線のみラインアートを使う運用が効率的。
ラインアートのパフォーマンス
ラインアートは CPU でエッジ検出のみを行い、描画にはグリースペンシルを使う。ラインアートモディフィアの最適化が不足しており、バージョン 2.93 の時点ではリアルタイムで動作できるポリゴン数の上限は2万ポリゴン程度。抽出される線が多いと、1万ポリゴン以下でも動作が重い。交差線の検出を有効にするとさらに遅くなる。
バージョン 3.3で一部のアルゴリズムがマルチスレッド化され、全体的に3倍以上高速化されている。このバージョンならば3万ポリゴン程度ならビューポートでリアルタイム動作させられる。
バージョン 3.0
バージョン 3.0 でロードのマルチスレッド化と交差線検出の高速化(40% 高速)が実装された。
バージョン 3.3
マルチスレッド化された四分木を採用し、三角形の挿入と交差判定とが高速化された。全体的に3倍以上高速化されている。
Blender のバージョン 3.3、Ryzen 5 2600 のマシンで、ラインアートを有効にした状態で3万ポリゴンのキャラクターを動かしたときのビューポートの fps は 15~30 だった。
パフォーマンスを上げるには
- ポリゴン数を減らす
- 遠景をローポリに差し替える
- 交差線を使わない
- 見えない・カメラに映らないメッシュを非表示にする
- ラインアートモディフィアを重ねない(2.93 のみ)
- チェーン化を無効にする
- 裏面を無視(Back Face Culling)を有効にする(3.1)
ラインアートは、他のオブジェクトに遮蔽されて不可視状態のポリゴンに対しても線の検出判定を行うので、見えない部分を非表示にするのは重要になる。底や裏面のポリゴンを削除するのも有効。
バージョン 2.93 のラインアートモディフィアは最適化が不足しており、ラインアートモディフィアを重ねると余計な計算が複数回行われる。なので可能な限りラインアートモディフィアを重ねず頂点ウェイト転送で線を編集する。バージョン 3.0 ではキャッシュが機能しているので、ラインアートを重ねてもパフォーマンスが低下しづらい。
裏面を無視(Back Face Culling)
裏面を無視を有効にするとカメラから見て法線が裏を向いているポリゴンの計算を省略するためパフォーマンスが上がる。
線のみが必要な場合
ラインアートがリアルタイムで動作する上限は2万ポリゴン程度だが、グリースペンシルオブジェクトは3万ストローク+ 10 万頂点でもリアルタイム動作が可能。
配列モディフィア
メッシュを配列モディフィアで複製するのではなく、グリースペンシルオブジェクトの配列モディフィアで線のみを複製する
縁取り
天井に埋め込まれた照明や窓枠などの単純な縁取りならば、マルチストロークモディフィアが使える。隙間ができるのでチェーン化の設定が必須になる。
ラインアートの非表示
ラインアートを無効にするには、グリースペンシルオブジェクトを非表示にするか、ラインアートモディフィアを非表示にする。
アウトライナーからモディフィアの可視性を変更できる。
カメラの設定
ラインアートはカメラから見る必要がある。カメラとビューポートとを一致させるには、ビュー > カメラ設定 > アクティブカメラ(Numpad 0)でカメラからの視点に切り替え、サイドバー(N)で「カメラをビューに」にチェックを入れる。
ラインアートの作成
「Shift + A > グリースペンシル」からコレクションやシーンを指定して作成するのが簡単だ。
1から設定するには以下の手順になる。
- ブランクのグリースペンシルを作成
- 「プロパティパネル > オブジェクトタブ > ビューポート表示 > 最前面」にチェックを入れる
- グリースペンシルの新規レイヤーを作成
- グリースペンシルのマテリアルを作成
- グリースペンシルにラインアートモディフィアを追加
- ラインアートモディフィアのコレクション、レイヤー、マテリアルを設定
ラインアートの設定
線幅・不透明度の設定
ラインアートモディフィアでも線幅・不透明度を設定できるが、これはプレビュー用だ。ラインアートをベイクするとこれは変更できない。なので最終的には幅モディフィアと不透明度モディフィアとで調整する。
エッジタイプ
それぞれのシルエット
ソースタイプがコレクションやシーンの場合複数のオブジェクトが含まれる。そのときスクリーン上でオブジェクトが重なっていても、それぞれのオブジェクトのシルエットが描画される。
ルーズ
面をもたない辺のみのエッジにも線を引く。これは任意の場所に線を出すときに便利。
ライトの輪郭
ライトの参照でライトを指定している場合に設定できる。オブジェクトの影の境界に線を引く。ただし辺に線が引かれるので、曲面では線が不自然になる。
影を生成
ライトの参照でライトを指定している場合に設定できる。落ち影に線を引く。
交差線のマスク(3.0)
交差線をマスクする場合はソースタイプをシーンにするか、マスクするコレクションをすべて含むコレクションを作成するかする必要がある。現状はオブジェクト単位のマスクしかサポートしてない。
色分けしたい場合は、マスクごとに別のレイヤーに出力する。
設定
交差線をマスクしたいオブジェクトのどちらか片方を別のコレクションに入れて、コレクションの設定で使用方法(Usage)を内容(Include)、マスクを設定する。
ラインアートモディフィアの交差線マスクを設定すると、交差線をマスクできる。
辺マーク
メッシュのエディットモードで「Ctrl + E > Freestyle辺をマーク」で任意の辺に線が出せる。辺マークを入れても線がでない場合は、重複する辺を輪郭にオプションを試す。
重複する辺を輪郭に
辺分離モディフィアを使ってシェーディングをコントロールしているメッシュは、分離箇所に二重に線が引かれてしまう。重複する辺を輪郭にオプションはこのような重複した線を除去してくれる。ただし実行速度は遅くなる。
辺マークをつけたのに線がでない場合に、このオプションを有効にすると線が出ることがある。
クリース
クリースは角度が閾値以下の辺に線を引く。なので背景用ビルやタンスのような鋭利なエッジを持つオブジェクトには適している。
クリースはベベルと相性が悪い。ハイポリゴンの家具等はクリース線が機能しないことが多く、リトポロジーが必要になるだろう。逆に局所的にクリース線を消したいときはベベルが使える。
曲面と鋭利なエッジで構成されたメッシュでクリースを使うと、ノイズが問題になりやすい。
曲面と鋭利なエッジで構成されたメッシュでクリースがうまく機能しない場合は、クリースを外して手動でエッジマークをつけるか、オブジェクトを分割するかする。
オブジェクトのクリース設定
「プロパティパネル > オブジェクト > ラインアート」でオブジェクトごとのクリースを設定できる。
アンベベルアドオン
Mira Tools
Modify タブにアンベベルがある。
UnBevel for Blender (Ringed Path Selection Pattern)($0+)
ベベルの側面の辺を選択して実行する。
遮蔽
ポリゴンの裏にある線を描画する機能。X線エフェクトやガラス窓等で必要になる。レベルは遮蔽されているポリゴン枚数。
透過
メッシュの透過マテリアルでマスクする機能。ガラス窓や眼鏡、水面など、意外と利用場面は多い。
メッシュの透過マテリアルの透過ビットはマテリアルタブで設定できる。
ラインアートの透過でマスクするマテリアルを設定する。透過メッシュがあることで遮蔽されているので、Occlusion のレベルも適切に設定する必要がある。
面マークフィルター
面マークフィルターを使うと、フリースタイルの面マークを設定した面の辺にのみ線が出せる。
反転
面マークを反転する。つまり面マークのついていない面のエッジに線が出る。
境界
面マークの境界の辺にのみ線を出す。
輪郭を維持
輪郭・シルエットで出した線は面マークがついていなくても消えなくする。
線の加工
入り抜き
幅モディフィア
ラインストロークに入り抜きを設定できる。
幅モディフィアを使った入り抜きはアニメーションではちらつきが発生する。
設定
幅を均一化にチェックを入れ、カスタムカーブを設定する。
頂点ウェイト転送
頂点ウェイト転送は、メッシュの頂点グループのウェイト情報を、グリースペンシルの頂点グループに転送する機能だ。この転送された情報をつかって、幅モディフィアの入り抜きを設定できる。チントモディフィアを使えば色トレスができる。そのほかラティスやノイズ等のモディフィアも頂点グループで影響力を設定できる。
出力にマッチ(Match Output)のチェックを外せば、転送先の頂点グループを指定できる。そうでない場合は、メッシュの頂点グループ名とグリースペンシルの頂点グループ名とは一致する必要がある。
頂点ウェイト転送のソースを絞り込み(Filter Source)の行頭が一致する頂点グループがすべて転送される。
設定手順
- メッシュの頂点グループで加工したい頂点を設定する
- Lineart モディフィアの 頂点ウェイト転送の項目で設定した頂点グループを指定
- グリースペンシルに頂点グループを作成。このとき頂点グループ名を一致させる
- チントモディフィアや不透明度モディフィアなど、頂点グループを使用するモディフィアを使用する
転送スクリプト
メッシュの頂点グループ名をグリースペンシルオブジェクトの頂点グループ名に複製するスクリプト。スクリプトの filter_source で指定した名前で始まる頂点グループ名のみが作成される。このスクリプトはメッシュとグリースペンシルオブジェクトとを選択して実行する。
import bpy filter_source = 'lineart' selects = bpy.context.selected_objects if len(selects) != 2: raise Exception("Select a mesh object and a grease pencil object") if selects[0].type == 'MESH': mesh = selects[0] lineart = selects[1] else: mesh = selects[1] lineart = selects[0] # set lineart filter gpms = [m for m in lineart.grease_pencil_modifiers if m.type == 'GP_LINEART'] for m in gpms: m.source_vertex_group = filter_source #m.use_remove_doubles = False # transfer vertex group name src_vgs = [v.name for v in mesh.vertex_groups if v.name.startswith(filter_source)] for vg in src_vgs: if lineart.vertex_groups.find(vg) == -1: # not found lineart.vertex_groups.new(name=vg)
チェーン化
入り抜きを入れると団子状の線が発生することがある。これは奥行き方向の距離差やエッジフローなどが原因で線がつながっていないために起こる。
チェーン化を設定すると、しきい値以下の線の始点と終点とが結合される。線をつなげるには、画像のしきい値(Image Threshold)を大きくし、角度で分割(Angle Splitting)を小さくする。
チェーン化のパフォーマンス
線が密集している状況でチェーン化が有効な場合、パフォーマンスが悪化する。チェーン化を無効にすることでビューポートのパフォーマンスを向上させられる。チェーン化を無効にするには、チェックをすべて外し、画像のしきい値を0に、角度で分割を 180° に設定する。
線のコントロール
線幅の固定
バージョン 4.3 からはグリースペンシルのストローク幅の設定がなくなったので、公式が配布しているジオメトリノードでスクリーン空間での線幅を設定する。数字を小さくすると線幅が太くなる。
バージョン 4.2 以前
カメラからの距離によって線の幅を変えたくない場合は、グリースペンシルのストローク幅を「スクリーン空間」にする。
ズーム時の線幅の問題
ラインアートの線幅は1が最小で、これ以上線を細くできない。これはズーム時に1より小さい線幅が求められる場合に問題になる。対策としてはエンプティにラインアートのグリースペンシルを除くすべてのオブジェクト(カメラやライト、背景を含む)を親子付けして、エンプティを 5~10 倍拡大する方法がある。
グリースペンシルオブジェクトを拡縮すると線幅を変更できるが、1より細くはならない。
幅の均一化
「幅の均一化」にチェックが入っているとラインアートや他の幅モディフィアの影響を受けなくなる。
ライトの不使用
グリースペンシルレイヤーはデフォルトではライトの影響を受ける。発光体に線を引く場合、線が黒くなるため、このチェックは外した方がいい。
任意の場所に線を置く
辺のみのポリゴンを配置すると任意の場所に線が出せる。シェイプキーを使ってメッシュ内に隠す、もしくは縮小すれば任意のタイミングで消すことも可能。
不要な線を除去する
以下の3つの方法がある。
- ベイクした後に線を削除する
- 頂点ウェイト転送 と不透明度モディフィアを使う
線一本単位の制御はベイク削除か、頂点ウェイト転送を使う。
クリースのノイズが問題になる場合は、シェイプキーやラティスで頂点を移動させる方法もある。
カメラの角度によって線の幅を変えるには視点依存リグを参照。
頂点ウェイト転送を使った不要線の除去
頂点ウェイト転送を使う場合は、線の出てほしくない辺のウェイトを1にして、不透明度モディフィアの係数を0にする。
巨大なモデルならば幅モディフィアの幅を0にする方法も使える。ただし幅モディフィアは線の幅が0にならないので、数センチメートルの大きさのオブジェクトの線はオブジェクトで隠せない。
(オブジェクトが巨大なので隠れてみえないだけ)
色トレス
色ごとにオブジェクトを分ける方法と、頂点ウェイト転送 を使う方法とがある。
色ごとにオブジェクトを分ける方法は、オブジェクトごとにラインアートモディフィアを重ねるだけなので設定が楽だ。しかしラインアートモディフィアを重ねるのは計算負荷が高い。
頂点ウェイト転送で色トレス
手順は以下のようになる。
- 色の数だけメッシュオブジェクトに頂点グループを作成し、ウェイトを割り当てる
- ラインアートのグリースペンシルオブジェクトの頂点グループにまったく同名の頂点グループを作成
- 頂点ウェイト転送 で頂点グループを転送
- 頂点グループでマスクしたチントモディフィアを色の数だけグリースペンシルオブジェクトにつける
チントモディフィアはマテリアルプレビューかレンダーシェーディングでしかプレビューできない。
線を滑らかにする
メッシュに再分割曲面モディフィアをつけると、平面部分も分割されてパフォーマンスが悪くなる。なのでグリースペンシルに再分割曲面をつけて線を滑らかにする方法が推奨される。ただしメッシュが線から飛び出ることがあるので、線を太くする必要があるかもしれない。
グリースペンシルに再分割曲面をつける方法ではチェーン化を有効にする必要がある。
被写界深度
Depth of Field with Grease Pencil Objects not working
グリースペンシルは被写界深度に対応していない。対策としては以下の3つがある。
1. グリースペンシルエフェクトのぼかし
グリースペンシルエフェクトのぼかしの被写界深度を使用を使う。ただし、線の一部にピントを合わせる方法はない。
2. グリースペンシルをメッシュに変換する
最も高品質だが、グリースペンシルを編集するたびに変換する手間が発生する。
3. コンポジットを使う
ビューポートで確認できないのがこの方法の欠点だ。
grease pencil experiment 4 - depth of field
フリースタイル
ラインアートで交差線だけ出力して、残りはフリースタイルを使う方法もある。
ベイク
ベイクは時間がかかる。フレーム数が多い場合は数GB~数十GBのメモリが必要になる。Ryzen 5 2600 のマシンで、4万ポリゴン・400 フレームのシーンをベイクするのに 20 分かかり、Blender の使用しているメモリは8GB、ベイク結果を保存したファイルは
ベイクしたグリースペンシルの頂点数は 600 万頂点になり、何をするにも数秒待たされる。バージョン 2.93 の時点では、数万ポリゴンのラインアートをベイクして編集することは実用的ではない。
ベイクの注意点
ベイクすると線画を編集できるが、ラインアートモディフィアの設定を変更できなくなる。ベイクをクリアするとグリースペンシルの編集内容は失われる。
ベイクすると「クリアなしで続行」もできる。別レイヤーを作成し、ラインアートモディフィアのターゲットレイヤーを切り替えることで、ベイク内容を保存しておける。
画像をグリースペンシルオブジェクトへ変換
ドラッグアンドドロップで画像をシーンに配置し、「オブジェクト > 変換 > 画像をグリースペンシルにトレース」でできる。アルファがあるとうまく機能しない。
SVG エクスポート
バージョン 2.93 以降はグリースペンシルを SVG にエクスポートできる。ラインアートの線をエクスポートするにはベイクする必要がある。ベイクする前にフレーム数を設定するのを忘れないようにする。
画像をメッシュに変換
Logo Tracer($0+)アドオンを使う。設定パネルは3Dビューポートにある。
高品質な変換が必要なら Inkscape のビットマップトレースを使って SVG に変換したあと、その SVG を Blender にインポートしてメッシュに変換する。
ラインアートのみレンダリング
方法はふたつある。
- ラインアートをベイクした後に、オブジェクトを非表示にしてレンダリングする
- ラインアートのみをレンダリングするビューレイヤーを作成しておき、ラインアートをベイクした後にレンダリングする
レンダリングテストを繰り返す場合は、ビューレイヤーを作成する方法がよい。コンポジターで表示するビューレイヤーを指定しておけば、再ベイク後にレンダリングするだけでラインアートのみをレンダリングできる。
トラブルシューティング
線がでない
線にパースがつく
線幅の固定を参照。
ビューポートの線が汚い・一部線が出ない
グリースペンシルオブジェクトの最前面のチェックを確認する。最前面にチェックを入れると、透過時に線がメッシュより手前に表示されてしまうのが欠点だ。
交差線が出ない
ラインアートモディフィアの「交差」のチェックを確認する。
ソースタイプがオブジェクトの場合、交差線がうまくでないことがある。
線が暗くなるところがある
グリースペンシルレイヤーの「ライトを使用」のチェックを外す。
チントモディフィアが機能しない
チントモディフィアはマテリアルプレビューかレンダーシェーディングでしかプレビューできない。
tips
シルエットベースのライン
セルアニメ風のラインが欲しい場合はエッジタイプのシルエットが近い。線が不足する部分は辺マークやマテリアル境界を使う。ただしこの方法はパーツごとにオブジェクト分けする必要があるので、管理が面倒かもしれない。
外部リンク
眉毛のラインだけ前髪の上に描く表現、ラインアートを使う方法↓
— まかろに (@cat01proto) July 23, 2022
1,Collection Line Art を作成し、眉毛のコレクションを設定。
2.Occlusion をオンにして、endを最大値(128)に設定
3.Material Mask を前髪のマテリアルと一致させる。#3DCG #b3d pic.twitter.com/wxfvV6UZzM
【Line Artモディファイアの機能紹介・使い方】リアルタイムで確認できる新しいライン描画方法【Blender2.93 / グリースペンシル】
開発資料
Line Art further improvement list(Line Art の実装予定機能リスト)
Line Art As GPencil Modifier FAQ
Yiming's Blender Wiki Content Index
WYSIWYG NPR: Drawing Strokes Directly on 3D Models
Two Fast Methods for High-Quality Line Visibility
A modified ZS thinning algorithm by a hybrid approach